package com.liyuan.entity;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.InputSplit;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class ArraySplit extends InputSplit implements Writable {
    private String[] dataArray; // 存储数组数据

    public ArraySplit() {
    }

    /**
     * 构造函数，初始化数组数据。
     *
     * @param dataArray 字符串数组数据。
     */
    public ArraySplit(String[] dataArray) {
        this.dataArray = dataArray;
    }

    /**
     * 获取数组数据的长度。
     *
     * @return 数组长度。
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    public long getLength() throws IOException, InterruptedException {
        // System.out.println(dataArray.length);
        return dataArray.length; // 数据长度即数组长度
    }

    /**
     * 获取数据的位置信息。因为是内存数据，所以返回空数组。
     *
     * @return 空字符串数组。
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    public String[] getLocations() throws IOException, InterruptedException {
        return dataArray; // 因为是内存数据，没有实际位置信息
    }

    /**
     * 序列化和反序列化方法。
     */
    @Override
    public void write(DataOutput out) throws IOException {
        out.writeInt(dataArray.length); // 写入数组长度
        for (String data : dataArray) {
            // System.out.println(data);
            out.writeUTF(data); // 写入每个字符串
        }
    }

    /**
     * 从输入流读取数据，实现反序列化。
     */
    @Override
    public void readFields(DataInput in) throws IOException {
        int len = in.readInt(); // 读取数组长度
        dataArray = new String[len];
        for (int i = 0; i < len; ++i) {
            // System.out.println(len);
            dataArray[i] = in.readUTF(); // 读取每个字符串
        }
    }
}
